#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H

#pragma pack(1) // 关闭字节对齐

#define ENVIRONMENT_CRTSCTS (1 << 16) // 控制模式
#define ENVIRONMENT_ACK_MAX (32)      // 数据最大值

#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <map>
#include <math.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <vector>

using namespace std;

extern unsigned int sleep(unsigned int);

class Environment {
  public:
    /***
     * @name 环境参数
     * @description
     * @struct
     */
    typedef struct tagENVIRONMENT {
        int32_t *fd;              // 环境指针
        pthread_t *tid;           // 环境ID
        uint32_t *signal;         // 环境信号
        uint32_t *pressure;       // 气压
        uint32_t *humidity;       // 湿度
        uint32_t *altitude;       // 海拔
        uint32_t *temperature;    // 温度
        uint32_t *lightIntensity; // 光照
        vector< uint8_t > *ack;   // 数据
    } ENVIRONMENTPARAM, *HENVIRONMENTPARAM;

    // 析构、构造
    ~Environment();
    Environment(const string path, const uint32_t baudrate);

    // 获取数据、获取气压、获取湿度、获取海拔、获取温度、获取光照
    vector< uint8_t > &get_ack();
    uint32_t &get_pressure();
    uint32_t &get_humidity();
    uint32_t &get_altitude();
    uint32_t &get_temperature();
    uint32_t &get_lightIntensity();

  private:
    int32_t fd;              // 环境指针
    pthread_t tid;           // 环境线程
    uint32_t signal;         // 环境信号
    ENVIRONMENTPARAM param;  // 环境参数
    uint32_t pressure;       // 气压
    uint32_t humidity;       // 湿度
    uint32_t altitude;       // 海拔
    uint32_t temperature;    // 温度
    uint32_t lightIntensity; // 光照
    vector< uint8_t > ack;   // 数据
};
#endif